home *** CD-ROM | disk | FTP | other *** search
/ Revista do CD-ROM 97 / CD-ROM 97 / CD-ROM 97.iso / jogos / spherical / Code / Game / paddle.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-14  |  12.7 KB  |  342 lines

  1.  
  2. // Copyright (C) 2002 by Luigi Pino.  All Rights Reserved.
  3.  
  4. /***************************************************************************/
  5.  
  6. #include "../library/neurosis.h"
  7. #include "draw.h"
  8. #include "file_io.h"
  9. #include "hiscore.h"
  10. #include "initialize.h"
  11. #include "main.h"
  12. #include "menu_misc.h"
  13. #include "paddle.h"
  14. #include "sphere.h"
  15. #include "update.h"
  16.  
  17. /***************************************************************************/
  18.  
  19. extern Object3_Class                    paddle[];
  20. extern Paddle_Struct                    paddle_object[];
  21. extern Sphere_Control_Struct    sphere_object[];
  22. extern Sub_Menu_Class                    menu_control;
  23. extern Sub_Menu_Class                    menu_options;
  24. extern Timing_Class                        timing;
  25. extern Values_Struct                    values;
  26.  
  27. /***************************************************************************/
  28.  
  29. void Initialize_Paddle_Object()
  30.  
  31. {
  32.     int x1;
  33.  
  34.     paddle_object[Up].movement.direction = 90.0f;
  35.     paddle_object[Up].movement.current.x = 0.0f;
  36.     paddle_object[Up].movement.current.y = 130.0f;
  37.     paddle_object[Up].movement.current.z = 0.0f;
  38.     paddle_object[Up].pts[0].x = -20.0f;
  39.     paddle_object[Up].pts[0].y = 10.0f;
  40.     paddle_object[Up].pts[1].x = 20.0f;
  41.     paddle_object[Up].pts[1].y = 10.0f;
  42.     paddle_object[Up].pts[2].x = 20.0f;
  43.     paddle_object[Up].pts[2].y = -10.0f;
  44.     paddle_object[Up].pts[3].x = -20.0f;
  45.     paddle_object[Up].pts[3].y = -10.0f;
  46.     paddle_object[Up].pts[4].x = paddle_object[Up].pts[0].x;
  47.     paddle_object[Up].pts[4].y = paddle_object[Up].pts[0].y;
  48.  
  49.     paddle_object[Down].movement.direction = 90.0f;
  50.     paddle_object[Down].movement.current.x = 0.0f;
  51.     paddle_object[Down].movement.current.y = -130.0f;
  52.     paddle_object[Down].movement.current.z = 0.0f;
  53.     paddle_object[Down].pts[0].x = -20.0f;
  54.     paddle_object[Down].pts[0].y = 10.0f;
  55.     paddle_object[Down].pts[1].x = 20.0f;
  56.     paddle_object[Down].pts[1].y = 10.0f;
  57.     paddle_object[Down].pts[2].x = 20.0f;
  58.     paddle_object[Down].pts[2].y = -10.0f;
  59.     paddle_object[Down].pts[3].x = -20.0f;
  60.     paddle_object[Down].pts[3].y = -10.0f;
  61.     paddle_object[Down].pts[4].x = paddle_object[Down].pts[0].x;
  62.     paddle_object[Down].pts[4].y = paddle_object[Down].pts[0].y;
  63.  
  64.     paddle_object[Left].movement.direction = 90.0f;
  65.     paddle_object[Left].movement.current.x = -130.0f;
  66.     paddle_object[Left].movement.current.y = 0.0f;
  67.     paddle_object[Left].movement.current.z = 0.0f;
  68.     paddle_object[Left].pts[0].x = 10.0f;
  69.     paddle_object[Left].pts[0].y = -20.0f;
  70.     paddle_object[Left].pts[1].x = 10.0f;
  71.     paddle_object[Left].pts[1].y = 20.0f;
  72.     paddle_object[Left].pts[2].x = -10.0f;
  73.     paddle_object[Left].pts[2].y = 20.0f;
  74.     paddle_object[Left].pts[3].x = -10.0f;
  75.     paddle_object[Left].pts[3].y = -20.0f;
  76.     paddle_object[Left].pts[4].x = paddle_object[Left].pts[0].y;
  77.     paddle_object[Left].pts[4].y = paddle_object[Left].pts[0].x;
  78.  
  79.     paddle_object[Right].movement.direction = 90.0f;
  80.     paddle_object[Right].movement.current.x = 130.0f;
  81.     paddle_object[Right].movement.current.y = 0.0f;
  82.     paddle_object[Right].movement.current.z = 0.0f;
  83.     paddle_object[Right].pts[0].x = 10.0f;
  84.     paddle_object[Right].pts[0].y = -20.0f;
  85.     paddle_object[Right].pts[1].x = 10.0f;
  86.     paddle_object[Right].pts[1].y = 20.0f;
  87.     paddle_object[Right].pts[2].x = -10.0f;
  88.     paddle_object[Right].pts[2].y = 20.0f;
  89.     paddle_object[Right].pts[3].x = -10.0f;
  90.     paddle_object[Right].pts[3].y = -20.0f;
  91.     paddle_object[Right].pts[4].x = paddle_object[Right].pts[0].y;
  92.     paddle_object[Right].pts[4].y = paddle_object[Right].pts[0].x;
  93.  
  94.     // Initialize paddle model and control
  95.     for (x1=Up;x1<=Right;x1=x1+1)
  96.         {
  97.             paddle[x1].Load_Model("Data/paddle.dat", t_paddle);
  98.             paddle[x1].Move(&paddle_object[x1].movement.current);
  99.  
  100.             if ((x1 == Left) || (x1 == Right))
  101.                 paddle[x1].Rotate_z(90.0f);
  102.  
  103.             paddle_object[x1].input.user = menu_control.Get_Current_Choice(x1);
  104.  
  105.             if (paddle_object[x1].input.user == Keyboard_1)
  106.                 paddle_object[x1].input.keyboard.Set_Keys(-1, -1, -1, -1, -1, -1, -1, -1, -1, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT);
  107.             else if (paddle_object[x1].input.user == Keyboard_2)
  108.                 paddle_object[x1].input.keyboard.Set_Keys(-1, -1, -1, -1, -1, -1, -1, -1, -1, 'W', 'S', 'A', 'D');
  109.         }
  110.  
  111.     if (values.game_type == High_Score)
  112.         {
  113.             paddle_object[Up].input.user = No_User;
  114.             paddle_object[Left].input.user = No_User;
  115.             paddle_object[Right].input.user = No_User;
  116.             paddle_object[Down].input.user = menu_control.Get_Current_Choice(Compete);
  117.  
  118.             if (paddle_object[Down].input.user == Keyboard_1)
  119.                 paddle_object[Down].input.keyboard.Set_Keys(-1, -1, -1, -1, -1, -1, -1, -1, -1, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT);
  120.             else if (paddle_object[Down].input.user == Keyboard_2)
  121.                 paddle_object[Down].input.keyboard.Set_Keys(-1, -1, -1, -1, -1, -1, -1, -1, -1, 'W', 'S', 'A', 'D');
  122.         }
  123.  
  124.     // Initialize paddle values
  125.     for (x1=Up;x1<=Right;x1=x1+1)
  126.         {
  127.             if (values.game_type == Countdown)
  128.                 paddle_object[x1].score = 300.0f + (menu_options.Get_Current_Choice(3) * 300.0f);
  129.             else
  130.                 paddle_object[x1].score = 0.0f;
  131.  
  132.             if (paddle_object[x1].input.user == No_User)
  133.                 {
  134.                     paddle_object[x1].score = 0.0f;
  135.                     paddle_object[x1].game_over = true;
  136.                 }
  137.             else
  138.                 paddle_object[x1].game_over = false;
  139.  
  140.             paddle_object[x1].time_lapse = 0.0f;
  141.             paddle_object[x1].time_lapse_score = 0.0f;
  142.         }
  143. }
  144.  
  145. /***************************************************************************/
  146.  
  147. void Paddle_AI(int current_paddle)
  148.  
  149. {
  150.     float        closest_distance;
  151.     float        distance;
  152.     float3    temp_from;
  153.     float3    temp_to;
  154.     int            closest_sphere = 0;
  155.     int            paddle_point_1;
  156.     int            paddle_point_2;
  157.     int            wall_point_1;
  158.     int            wall_point_2;
  159.  
  160.     temp_from.x = paddle_object[current_paddle].movement.current.x;
  161.     temp_from.y = paddle_object[current_paddle].movement.current.y;
  162.     temp_from.z = 0.0f;
  163.  
  164.     temp_to.x = sphere_object[0].movement.current.x;
  165.     temp_to.y = sphere_object[0].movement.current.y;
  166.     temp_to.z = 0.0f;
  167.  
  168.     closest_distance = Get_Distance(&temp_from, &temp_to);
  169.     closest_sphere = 0;
  170.  
  171.     for (int x1=1;x1<values.sphere_number;x1=x1+1)
  172.         {
  173.             temp_to.x = sphere_object[x1].movement.current.x;
  174.             temp_to.y = sphere_object[x1].movement.current.y;
  175.             temp_to.z = 0.0f;
  176.  
  177.             distance = Get_Distance(&temp_from, &temp_to);
  178.  
  179.             if (distance < closest_distance)
  180.                 {
  181.                     closest_distance = distance;
  182.                     closest_sphere = x1;
  183.                 }
  184.         }
  185.  
  186.     if (current_paddle == Up)
  187.         {
  188.             paddle_point_1 = 2;
  189.             paddle_point_2 = 3;
  190.             wall_point_1 = 37;
  191.             wall_point_2 = 34;
  192.         }
  193.     else if (current_paddle == Down)
  194.         {
  195.             paddle_point_1 = 0;
  196.             paddle_point_2 = 1;
  197.             wall_point_1 = 13;
  198.             wall_point_2 = 10;
  199.         }
  200.     else if (current_paddle == Left)
  201.         {
  202.             paddle_point_1 = 1;
  203.             paddle_point_2 = 0;
  204.             wall_point_1 = 25;
  205.             wall_point_2 = 22;
  206.         }
  207.     else
  208.         {
  209.             paddle_point_1 = 3;
  210.             paddle_point_2 = 2;
  211.             wall_point_1 = 49;
  212.             wall_point_2 = 46;
  213.         }
  214.  
  215.     paddle_object[current_paddle].input.direction[Left].x = 0.0f;
  216.     paddle_object[current_paddle].input.direction[Right].x = 0.0f;
  217.  
  218.     if ((current_paddle == Up) || (current_paddle == Down))
  219.         {
  220.             if (sphere_object[closest_sphere].movement.current.x < (paddle_object[current_paddle].movement.current.x + paddle_object[current_paddle].pts[paddle_point_1].x))
  221.                 paddle_object[current_paddle].input.direction[Left].x = 1.0f;
  222.             else if (sphere_object[closest_sphere].movement.current.x > (paddle_object[current_paddle].movement.current.x + paddle_object[current_paddle].pts[paddle_point_2].x))
  223.                 paddle_object[current_paddle].input.direction[Right].x = 1.0f;
  224.         }
  225.     else
  226.         {
  227.             if (sphere_object[closest_sphere].movement.current.y < (paddle_object[current_paddle].movement.current.y + paddle_object[current_paddle].pts[paddle_point_1].y))
  228.                 paddle_object[current_paddle].input.direction[Left].x = 1.0f;
  229.             else if (sphere_object[closest_sphere].movement.current.y > (paddle_object[current_paddle].movement.current.y + paddle_object[current_paddle].pts[paddle_point_2].y))
  230.                 paddle_object[current_paddle].input.direction[Right].x = 1.0f;
  231.         }
  232.  
  233.     Paddle_Movement(current_paddle);
  234. }
  235.  
  236. /***************************************************************************/
  237.  
  238. void Paddle_Movement(int current_paddle)
  239.  
  240. {
  241.     // Save old position
  242.     paddle_object[current_paddle].movement.previous.x = paddle_object[current_paddle].movement.current.x;
  243.     paddle_object[current_paddle].movement.previous.y = paddle_object[current_paddle].movement.current.y;
  244.  
  245.     if (paddle_object[current_paddle].input.direction[Left].x > 0.0f)
  246.         {
  247.             paddle_object[current_paddle].input.direction[Left].x = 0.0f;
  248.             paddle_object[current_paddle].movement.direction = paddle_object[current_paddle].movement.direction - (450.0f * timing.Get_Scale());
  249.  
  250.             if (paddle_object[current_paddle].movement.direction < 0.0f)
  251.                 paddle_object[current_paddle].movement.direction = 0.0f;
  252.         }
  253.     else if (paddle_object[current_paddle].input.direction[Right].x > 0.0f)
  254.         {
  255.             paddle_object[current_paddle].input.direction[Right].x = 0.0f;
  256.             paddle_object[current_paddle].movement.direction = paddle_object[current_paddle].movement.direction + (450.0f * timing.Get_Scale());
  257.  
  258.             if (paddle_object[current_paddle].movement.direction > 180.0f)
  259.                 paddle_object[current_paddle].movement.direction = 180.0f;
  260.         }
  261.     else
  262.         {
  263.             if (paddle_object[current_paddle].movement.direction > 90.0f)
  264.                 {
  265.                     paddle_object[current_paddle].movement.direction = paddle_object[current_paddle].movement.direction - (450.0f * timing.Get_Scale());
  266.  
  267.                     if (paddle_object[current_paddle].movement.direction < 90.0f)
  268.                         paddle_object[current_paddle].movement.direction = 90.0f;
  269.                 }
  270.             else if (paddle_object[current_paddle].movement.direction < 90.0f)
  271.                 {
  272.                     paddle_object[current_paddle].movement.direction = paddle_object[current_paddle].movement.direction + (450.0f * timing.Get_Scale());
  273.  
  274.                     if (paddle_object[current_paddle].movement.direction > 90.0f)
  275.                         paddle_object[current_paddle].movement.direction = 90.0f;
  276.                 }
  277.         }
  278.  
  279.     if ((current_paddle == Up) || (current_paddle == Down))
  280.         {
  281.             paddle_object[current_paddle].movement.current.x = paddle_object[current_paddle].movement.current.x - (Cos_F(paddle_object[current_paddle].movement.direction) * (values.paddle_speed * timing.Get_Scale()));
  282.  
  283.             if (paddle_object[current_paddle].movement.current.x < -60.0f)
  284.                 {
  285.                     paddle_object[current_paddle].movement.current.x = -60.0f;
  286.                     paddle_object[current_paddle].movement.direction = 90.0f;
  287.                 }
  288.             else if (paddle_object[current_paddle].movement.current.x > 60.0f)
  289.                 {
  290.                     paddle_object[current_paddle].movement.current.x = 60.0f;
  291.                     paddle_object[current_paddle].movement.direction = 90.0f;
  292.                 }
  293.         }
  294.     else
  295.         {
  296.             paddle_object[current_paddle].movement.current.y = paddle_object[current_paddle].movement.current.y - (Cos_F(paddle_object[current_paddle].movement.direction) * (values.paddle_speed * timing.Get_Scale()));
  297.  
  298.             if (paddle_object[current_paddle].movement.current.y < -60.0f)
  299.                 {
  300.                     paddle_object[current_paddle].movement.current.y = -60.0f;
  301.                     paddle_object[current_paddle].movement.direction = 90.0f;
  302.                 }
  303.             else if (paddle_object[current_paddle].movement.current.y > 60.0f)
  304.                 {
  305.                     paddle_object[current_paddle].movement.current.y = 60.0f;
  306.                     paddle_object[current_paddle].movement.direction = 90.0f;
  307.                 }
  308.         }
  309.  
  310.     // Calculate increment of paddle position
  311.     paddle_object[current_paddle].movement.increment.x = paddle_object[current_paddle].movement.current.x - paddle_object[current_paddle].movement.previous.x;
  312.     paddle_object[current_paddle].movement.increment.y = paddle_object[current_paddle].movement.current.y - paddle_object[current_paddle].movement.previous.y;
  313.     paddle_object[current_paddle].movement.increment.z = 0.0f;
  314.  
  315.     paddle[current_paddle].Move(&paddle_object[current_paddle].movement.increment);
  316. }
  317.  
  318. /***************************************************************************/
  319.  
  320. void Paddle_User_Input(int current_paddle)
  321.  
  322. {
  323.     if ((paddle_object[current_paddle].input.user >= Joystick_1) && (paddle_object[current_paddle].input.user <= Joystick_4))
  324.         {
  325.             joyGetPosEx(paddle_object[current_paddle].input.user - Joystick_1, &paddle_object[current_paddle].input.joystick.info);
  326.             paddle_object[current_paddle].input.Get_Info();
  327.         }
  328.     else if ((paddle_object[current_paddle].input.user == Keyboard_1) || (paddle_object[current_paddle].input.user == Keyboard_2))
  329.         paddle_object[current_paddle].input.Get_Info();
  330.  
  331.     if ((current_paddle == Left) || (current_paddle == Right))
  332.         {
  333.             paddle_object[current_paddle].input.direction[Left].x = paddle_object[current_paddle].input.direction[Down].x;
  334.             paddle_object[current_paddle].input.direction[Right].x = paddle_object[current_paddle].input.direction[Up].x;
  335.             paddle_object[current_paddle].input.direction[Down].x = 0.0f;
  336.             paddle_object[current_paddle].input.direction[Up].x = 0.0f;
  337.         }
  338.  
  339.     Paddle_Movement(current_paddle);
  340. }
  341.  
  342. /***************************************************************************/